package com.example.demo.repository;

import com.example.demo.entity.AccountEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 账户数据访问接口
 * <p>
 * Spring Data JPA仓库接口，自动实现与账户相关的数据库操作。
 * 继承自JpaRepository获得常用的CRUD方法(增删改查)：
 * - save(entity): 保存或更新实体
 * - findById(id): 根据ID查找单个实体
 * - findAll(): 查找所有实体
 * - deleteById(id): 根据ID删除实体
 * - count(): 统计实体数量
 * 等等...
 * <p>
 * 该接口中的自定义方法会根据方法名称规则自动生成实现。
 * 第一个泛型参数AccountEntity是实体类型，第二个String是ID的类型。
 */
@Repository
public interface AccountRepository extends JpaRepository<AccountEntity, String> {
    
    /**
     * 查找设置为默认的账户
     * <p>
     * 方法名解析：
     * - findBy: 定义这是一个查询方法
     * - IsDefault: 查询条件，匹配AccountEntity中的isDefault字段
     * - True: 条件值，匹配isDefault=true的记录
     * 
     * 该方法用于获取系统中设置为默认的账户(可能有多个，虽然业务上通常只有一个)。
     * 默认账户通常用于系统级操作，如在没有指定账户时用于签名交易。
     * 
     * 等效SQL: SELECT * FROM account WHERE is_default = true
     * 
     * @return 标记为默认的账户列表，正常情况下应只有一个元素
     */
    List<AccountEntity> findByIsDefaultTrue();
    
    /**
     * 查找所有账户并按创建时间降序排序
     * <p>
     * 方法名解析：
     * - findAllBy: 查找所有记录，不附加条件
     * - OrderBy: 表示排序开始
     * - CreateTime: 排序字段，匹配实体中的createTime属性
     * - Desc: 降序排序(最新创建的排在前面)
     * 
     * 该方法用于获取系统中所有账户，并按创建时间从新到旧排序。
     * 通常用于展示账户列表，让用户查看或选择已有账户。
     * 
     * 等效SQL: SELECT * FROM account ORDER BY create_time DESC
     * 
     * @return 按创建时间降序排列的所有账户列表
     */
    List<AccountEntity> findAllByOrderByCreateTimeDesc();
} 